package com.smarthome.web.property.utils;

import java.util.List;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;

import com.smarthome.common.tools.BossCachedKeysUtil;
import com.smarthome.common.tools.SHACipher;
import com.smarthome.common.tools.SpringUtils;
import com.smarthome.common.tools.cache.JedisUtils;
import com.smarthome.domain.bean.ShResidence;
import com.smarthome.domain.bean.ShUser;
import com.smarthome.domain.common.Constants;
import com.smarthome.domain.enums.ShUserSuperFlagEnum;
import com.smarthome.web.property.auth.ShiroRealm;
import com.smarthome.web.property.auth.ShiroUser;

public class UserHolder {

    /**
     * 获取当前用户
     * @return
     * @createTime 2015年10月8日 下午9:22:07
     * @author KongXiangyu
     */
    public static ShUser getUser() {
        Subject subject = SecurityUtils.getSubject();
        ShiroUser user = (ShiroUser) subject.getPrincipal();
        if (null == user)
            return null;
        String sessionId = "";
        try {
            sessionId = SHACipher.encrypt(user.getLoginName());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return JedisUtils.get(BossCachedKeysUtil.getKey(BossCachedKeysUtil.MODULE_USER_PREFIX, sessionId), ShUser.class);
    }

    /**
     * 获取当前用户权限
     * @return
     * @createTime 2015年10月8日 下午9:22:21
     * @author KongXiangyu
     */
    public static String getResource() {
        Subject subject = SecurityUtils.getSubject();
        ShiroUser user = (ShiroUser) subject.getPrincipal();
        if (null == user)
            return "";
        String sessionId = "";
        try {
            sessionId = SHACipher.encrypt(user.getLoginName());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return (String) JedisUtils.get(BossCachedKeysUtil.getKey(BossCachedKeysUtil.MODULE_USER_RESOURCE, sessionId));
    }

    /**
     * 获取当前用户所有小区域
     * @return
     * @createTime 2015年10月8日 下午9:22:37
     * @author KongXiangyu
     */
    public static List<ShResidence> getResidences() {
        ShUser shUser = getUser();
        return null != shUser ? shUser.getResidences() : null;
    }
    
    /**
     * @title 获取当前切换的小区 id
     * @createTime 2015年10月9日 下午3:49:03
     * @author dhc
     */
   public static Long getCurrentResidenceId(){
	   return     getCurrentResidence().getId();
   }

    /**
     * 获取当前用户当前小区域
     * @return
     * @createTime 2015年10月8日 下午9:22:37
     * @author KongXiangyu
     */
    public static ShResidence getCurrentResidence() {
        ShUser shUser = getUser();
        return null != shUser ? shUser.getCurrentResidence() : null;
    }

    /**
     * 获取当前用户名
     * @return
     * @createTime 2015年10月8日 下午9:22:57
     * @author KongXiangyu
     */
    public static String getLoginUserName() {
        ShUser shUser = getUser();
        if (shUser != null) {
            return shUser.getLoginName();
        }
        return null;
    }

    /**
     * 获取当前用户id
     * @return
     * @createTime 2015年10月8日 下午9:23:15
     * @author KongXiangyu
     */
    public static Long getUserId() {
        ShUser shUser = getUser();
        if (shUser != null) {
            return shUser.getId();
        }
        return null;
    }

    /**
     * 重置当前小区域
     * @param residenceId
     * @createTime 2015年10月8日 下午9:20:49
     * @author KongXiangyu
     */
    public static void resetResidenceId(Long residenceId) {
        Subject subject = SecurityUtils.getSubject();
        ShiroUser user = (ShiroUser) subject.getPrincipal();
        if (null == user)
            return;
        String sessionId = "";
        try {
            sessionId = SHACipher.encrypt(user.getLoginName());
        } catch (Exception e) {
            e.printStackTrace();
        }
        JedisUtils.set(BossCachedKeysUtil.getKey(BossCachedKeysUtil.MODULE_USER_RESIDENCE_PREFIX, sessionId), residenceId);
        ShiroRealm shiroRealm = (ShiroRealm) SpringUtils.getBean("shiroRealm");
        shiroRealm.clearCachedAuthorizationInfo(subject.getPrincipal());
        subject.isPermitted("/test");
    }

    /**
     * 重载所有用户权限
     * @createTime 2015年10月8日 下午9:21:21
     * @author KongXiangyu
     */
    public static void reloadAllPrivileges() {
        ShiroRealm shiroRealm = (ShiroRealm) SpringUtils.getBean("shiroRealm");
        shiroRealm.clearAllCachedAuthorizationInfo();
        Subject subject = SecurityUtils.getSubject();
        subject.isPermitted("/test");
    }

    /**
     * 登陆退出清除缓存
     * @createTime 2015年10月8日 下午9:23:31
     * @author KongXiangyu
     */
    public static void removeCurrentUser() {
        Subject subject = SecurityUtils.getSubject();
        ShiroUser user = (ShiroUser) subject.getPrincipal();
        if (null == user)
            return;
        String sessionId = "";
        try {
            sessionId = SHACipher.encrypt(user.getLoginName());
        } catch (Exception e) {
            e.printStackTrace();
        }
        JedisUtils.del(BossCachedKeysUtil.getKey(BossCachedKeysUtil.MODULE_USER_PREFIX, sessionId));
        JedisUtils.del(BossCachedKeysUtil.getKey(BossCachedKeysUtil.MODULE_USER_RESOURCE, sessionId));
        JedisUtils.del(BossCachedKeysUtil.getKey(BossCachedKeysUtil.MODULE_USER_RESIDENCE_PREFIX, sessionId));
    }

    /**
     * @title 判断是否是超级管理员
     * @createTime 2015年9月26日 下午4:49:18
     * @author dhc
     */
    public static boolean isSuperAdmin() {
        boolean isSuper = false;
        try {
            isSuper = ShUserSuperFlagEnum.SUPER.getFlag() == getUser().getSuperFlag().intValue();
        } catch (Exception e) {
        }
        return isSuper;
    }
    
    /**
     * @title 判断是否是超级管理小区（域）
     * @createTime 2015年10月11日 下午12:20:48
     * @author dhc
     */
    public static boolean isSuperResidence(){
    	boolean isSupper = false;
    	
    	try{
    		isSupper = Constants.PLATFORM_MANAGE_RESIDENCE_ID.equals(getCurrentResidenceId());
    	} catch(Exception e){
    		e.printStackTrace();
    	}
    	
    	return isSupper;
    }
}
